package pfc.aviloc.configuracion;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

import pfc.aviloc.R;
import pfc.aviloc.comunicacion.Comunicacion;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.telephony.TelephonyManager;
import android.view.Gravity;
import android.widget.Toast;

public class ConfiguracionPreferenceActivity extends PreferenceActivity {
	// implements OnPreferenceClickListener, OnSharedPreferenceChangeListener {

	private static String idUsuario;

	PreferenceScreen datosServidorPreference;
	EditTextPreference ipServidorPreference;
	EditTextPreference puertoServidorPreference;
	CheckBoxPreference sincroServidorPreference;
	PreferenceScreen registroMovilEnServidorPreference;
	EditTextPreference dniRegistroMovilPreference;
	EditTextPreference passwordRegistroMovilPreference;
	CheckBoxPreference registrarMovilEnServidorPreference;

	EditTextPreference horaTomaMedicamentoDesayuno;	
	EditTextPreference horaTomaMedicamentoComida;	
	EditTextPreference horaTomaMedicamentoMerienda;	
	EditTextPreference horaTomaMedicamentoCena;	
	EditTextPreference horaTomaMedicamentoAcostarse;		
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		addPreferencesFromResource(R.xml.configuracion_xml);

		
		//*************************************************
		// Configuracion para Configuracion del Servidor.
		//*************************************************
		datosServidorPreference = (PreferenceScreen) findPreference(getString(R.string.setting_clave_datos_servidor));
		ipServidorPreference = (EditTextPreference) findPreference(getString(R.string.setting_clave_ip_servidor));
		puertoServidorPreference = (EditTextPreference) findPreference(getString(R.string.setting_clave_puerto_servidor));
		sincroServidorPreference = (CheckBoxPreference) findPreference(getString(R.string.setting_clave_sincronizacion_servidor));
		registroMovilEnServidorPreference = (PreferenceScreen) findPreference(getString(R.string.setting_clave_registro_en_servidor));
		dniRegistroMovilPreference = (EditTextPreference) findPreference(getString(R.string.setting_clave_dni_registro_en_servidor));
		passwordRegistroMovilPreference = (EditTextPreference) findPreference(getString(R.string.setting_clave_password_registro_en_servidor));
		registrarMovilEnServidorPreference = (CheckBoxPreference) findPreference(getString(R.string.setting_clave_registrar_usuario_en_servidor));
		
		// Se ponen la etiquetas correctas en los Sumary de los datos del
		// Servidor (que varian segun el estado)
		if (isSincronismoServidor(this)) {
			datosServidorPreference
					.setSummary(getString(R.string.setting_sumary_datos_servidor_valido_1)
							+ " "
							+ getDireccionIp(this)
							+ " "
							+ getString(R.string.setting_sumary_datos_servidor_valido_2)
							+ " " + getPuerto(this));
			ipServidorPreference
					.setSummary(getString(R.string.setting_sumary_ip_servidor_verificada)
							+ " " + getDireccionIp(this));
			puertoServidorPreference
					.setSummary(getString(R.string.setting_sumary_puerto_servidor_verificado)
							+ getPuerto(this));
			sincroServidorPreference
					.setSummary(getString(R.string.setting_sumary_sincronizacion_servidor_realizado));
		} else {
			datosServidorPreference
					.setSummary(getString(R.string.setting_sumary_datos_servidor));
			if (isDireccionIpValida(getDireccionIp(this))) {
				ipServidorPreference
						.setSummary(getString(R.string.setting_sumary_ip_servidor_verificada)
								+ " " + getDireccionIp(this));
			} else {
				ipServidorPreference
						.setSummary(getString(R.string.setting_sumary_ip_servidor));
			}
			if (isPuertoValido(getPuerto(this))) {
				puertoServidorPreference
						.setSummary(getString(R.string.setting_sumary_puerto_servidor_verificado)
								+ " " + getPuerto(this));
			} else {
				puertoServidorPreference
						.setSummary(getString(R.string.setting_sumary_puerto_servidor));
			}
			sincroServidorPreference
					.setSummary(getString(R.string.setting_sumary_sincronizacion_servidor));
		}
		// Se ponen la etiquetas correctas en los Sumary del Registro del movil
		// en el servidor (que varian segun el estado)
		if (isRegistroMovilEnServidor(this)) {
			registroMovilEnServidorPreference
					.setSummary(getString(R.string.setting_sumary_registro_en_servidor_valido));
			dniRegistroMovilPreference
					.setSummary(getString(R.string.setting_sumary_dni_registro_en_servidor_verificado));
			passwordRegistroMovilPreference
					.setSummary(getString(R.string.setting_sumary_password_registro_en_servidor_verificado));
			registrarMovilEnServidorPreference
					.setSummary(getString(R.string.setting_sumary_registrar_usuario_en_servidor_realizado));
		} else {
			registroMovilEnServidorPreference
					.setSummary(getString(R.string.setting_sumary_registro_en_servidor));
			if (isDNIValido(getDNI(this))) {
				dniRegistroMovilPreference
						.setSummary(getString(R.string.setting_sumary_dni_registro_en_servidor_verificado));
			} else {
				dniRegistroMovilPreference
						.setSummary(getString(R.string.setting_sumary_dni_registro_en_servidor));
			}
			if (isPasswordValido(getPassword(this))) {
				passwordRegistroMovilPreference
						.setSummary(getString(R.string.setting_sumary_password_registro_en_servidor_verificado));
			} else {
				passwordRegistroMovilPreference
						.setSummary(getString(R.string.setting_sumary_password_registro_en_servidor));
			}
			registrarMovilEnServidorPreference
					.setSummary(getString(R.string.setting_sumary_registrar_usuario_en_servidor));
		}

		// Al cambiar la direccion IP en la configuracion, comprobamos si tiene
		// una estructura valida.
		ipServidorPreference
				.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
					public boolean onPreferenceChange(Preference preference,
							Object newValueIP) {
						boolean dirValida = isDireccionIpValida((String) newValueIP);
						if (dirValida) {
							ipServidorPreference
									.setSummary(getString(R.string.setting_sumary_ip_servidor_verificada)
											+ " " + newValueIP);
						} else {
							ipServidorPreference
									.setSummary(getString(R.string.setting_sumary_ip_servidor));
							ipServidorPreference
									.setText(getString(R.string.setting_valor_defecto_ip_servidor));
							datosServidorPreference
									.setSummary(getString(R.string.setting_sumary_datos_servidor));
						}
						sincroServidorPreference.setChecked(false);
						sincroServidorPreference
								.setSummary(getString(R.string.setting_sumary_sincronizacion_servidor));

						return dirValida;
					}
				});

		// Al cambiar el puerto del servidor en la configuracion, comprobamos si
		// tiene una estructura valida.
		puertoServidorPreference
				.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
					public boolean onPreferenceChange(Preference preference,
							Object newPuerto) {
						boolean puertoValida = isPuertoValido((String) newPuerto);
						if (puertoValida) {
							puertoServidorPreference
									.setSummary(getString(R.string.setting_sumary_puerto_servidor_verificado)
											+ " " + newPuerto);
						} else {
							puertoServidorPreference
									.setSummary(getString(R.string.setting_sumary_puerto_servidor));
							puertoServidorPreference
									.setText(getString(R.string.setting_valor_defecto_puerto_servidor));
							datosServidorPreference
									.setSummary(getString(R.string.setting_sumary_datos_servidor));
						}
						sincroServidorPreference.setChecked(false);
						sincroServidorPreference
								.setSummary(getString(R.string.setting_sumary_sincronizacion_servidor));

						return puertoValida;
					}
				});

		// Al comprobar el sincronismo del servidor, vemos si la direccion IP y
		// puerto son correctos y vemos si el servidor emite una respuesta.
		sincroServidorPreference
				.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
					public boolean onPreferenceChange(Preference preference,
							Object newValue) {
						boolean sincro = comprobarSincronismo();
						if (sincro) {
							sincroServidorPreference
									.setSummary(getString(R.string.setting_sumary_sincronizacion_servidor_realizado));
							datosServidorPreference.setSummary(getString(R.string.setting_sumary_datos_servidor_valido_1)
									+ " "
									+ ConfiguracionPreferenceActivity
											.getDireccionIp(ConfiguracionPreferenceActivity.this)
									+ " "
									+ getString(R.string.setting_sumary_datos_servidor_valido_2)
									+ " "
									+ ConfiguracionPreferenceActivity
											.getPuerto(ConfiguracionPreferenceActivity.this));
							sincroServidorPreference.setChecked(true);

							finish();
							Intent mainIntent = new Intent(
									ConfiguracionPreferenceActivity.this,
									ConfiguracionPreferenceActivity.class);
							startActivity(mainIntent);
						} else {
							sincroServidorPreference
									.setSummary(getString(R.string.setting_sumary_sincronizacion_servidor));
							datosServidorPreference
									.setSummary(getString(R.string.setting_sumary_datos_servidor));
							sincroServidorPreference.setChecked(false);
						}
						return false;
					}
				});

		// Al cambiar el DNI en la configuracion, comprobamos si tiene una
		// estructura valida.
		dniRegistroMovilPreference
				.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
					public boolean onPreferenceChange(Preference preference,
							Object newValueDNI) {
						boolean dniValido = isDNIValido((String) newValueDNI);
						if (dniValido) {
							dniRegistroMovilPreference
									.setSummary(getString(R.string.setting_sumary_dni_registro_en_servidor_verificado));
						} else {
							Toast toast = Toast
									.makeText(
											ConfiguracionPreferenceActivity.this,
											getString(R.string.setting_mensaje_registrar_usuario_en_servidor_error_dni),
											Toast.LENGTH_LONG);
							toast.setGravity(Gravity.BOTTOM, 0, 0);
							toast.show();
							dniRegistroMovilPreference
									.setSummary(getString(R.string.setting_sumary_dni_registro_en_servidor));
							dniRegistroMovilPreference
									.setText(getString(R.string.setting_valor_defecto_dni_registro_en_servidor));
							registroMovilEnServidorPreference
									.setSummary(getString(R.string.setting_sumary_registro_en_servidor));
						}
						registrarMovilEnServidorPreference.setChecked(false);
						registrarMovilEnServidorPreference
								.setSummary(getString(R.string.setting_sumary_registrar_usuario_en_servidor));
						setIdUsuario(null);
						return dniValido;
					}
				});

		// Al cambiar el password en la configuracion, comprobamos si esta
		// vacio.
		passwordRegistroMovilPreference
				.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
					public boolean onPreferenceChange(Preference preference,
							Object newPassword) {
						boolean passwordValido = isPasswordValido((String) newPassword);
						if (passwordValido) {
							passwordRegistroMovilPreference
									.setSummary(getString(R.string.setting_sumary_password_registro_en_servidor_verificado));
						} else {
							passwordRegistroMovilPreference
									.setSummary(getString(R.string.setting_sumary_password_registro_en_servidor));
							passwordRegistroMovilPreference
									.setText(getString(R.string.setting_valor_defecto_password_registro_en_servidor));
							registroMovilEnServidorPreference
									.setSummary(getString(R.string.setting_sumary_registro_en_servidor));
						}
						registrarMovilEnServidorPreference.setChecked(false);
						registrarMovilEnServidorPreference
								.setSummary(getString(R.string.setting_sumary_registrar_usuario_en_servidor));
						setIdUsuario(null);
						return passwordValido;
					}
				});

		// Al realizar el registro en el servidor, vemos si el DNI y Password
		// son correcto y vemos la respuesta del servidor.
		registrarMovilEnServidorPreference
				.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
					public boolean onPreferenceChange(Preference preference,
							Object newValue) {
						boolean registrado = comprobarRegistroMovil();
						if (registrado) {
							registrarMovilEnServidorPreference
									.setSummary(getString(R.string.setting_sumary_registrar_usuario_en_servidor_realizado));
							registroMovilEnServidorPreference
									.setSummary(getString(R.string.setting_sumary_registro_en_servidor_valido));
							registrarMovilEnServidorPreference.setChecked(true);

							finish();
							Intent mainIntent = new Intent(
									ConfiguracionPreferenceActivity.this,
									ConfiguracionPreferenceActivity.class);
							startActivity(mainIntent);
						} else {
							registrarMovilEnServidorPreference
									.setSummary(getString(R.string.setting_sumary_registrar_usuario_en_servidor));
							registroMovilEnServidorPreference
									.setSummary(getString(R.string.setting_sumary_registro_en_servidor));
							registrarMovilEnServidorPreference
									.setChecked(false);
						}
						return false;
					}
				});
		//*************************************************
		// FIN Configuracion para Configuracion del Servidor.
		//*************************************************
		
		//*************************************************
		// Configuracion para Medicamentos.
		//*************************************************
		horaTomaMedicamentoDesayuno = (EditTextPreference) findPreference(getString(R.string.setting_clave_medicamentos_hora_toma_desayuno));
		horaTomaMedicamentoComida = (EditTextPreference) findPreference(getString(R.string.setting_clave_medicamentos_hora_toma_comida));
		horaTomaMedicamentoMerienda = (EditTextPreference) findPreference(getString(R.string.setting_clave_medicamentos_hora_toma_merienda));
		horaTomaMedicamentoCena = (EditTextPreference) findPreference(getString(R.string.setting_clave_medicamentos_hora_toma_cena));	
		horaTomaMedicamentoAcostarse = (EditTextPreference) findPreference(getString(R.string.setting_clave_medicamentos_hora_toma_acostarse));
				
		// Se ponen la etiquetas correctas en los Sumary de la hora de toma de medicamentos.
		horaTomaMedicamentoDesayuno.setSummary(getString(R.string.setting_sumary_medicamentos_hora_toma_desayuno)+  " " + getHoraTomaDesayuno(this));
		horaTomaMedicamentoComida.setSummary(getString(R.string.setting_sumary_medicamentos_hora_toma_comida)+  " " + getHoraTomaComida(this));
		horaTomaMedicamentoMerienda.setSummary(getString(R.string.setting_sumary_medicamentos_hora_toma_merienda)+  " " + getHoraTomaMerienda(this));
		horaTomaMedicamentoCena.setSummary(getString(R.string.setting_sumary_medicamentos_hora_toma_cena)+  " " + getHoraTomaCena(this));
		horaTomaMedicamentoAcostarse.setSummary(getString(R.string.setting_sumary_medicamentos_hora_toma_acostarse)+  " " + getHoraTomaAcostarse(this));				
		
		// Al cambiar alguna hora de toma, comprobamos si tiene una estructura valida.
		horaTomaMedicamentoDesayuno
				.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
					public boolean onPreferenceChange(Preference preference, Object newHora) {
						boolean horaValida = isHoraValida((String) newHora);
						if (horaValida) {
							horaTomaMedicamentoDesayuno
									.setSummary(getString(R.string.setting_sumary_medicamentos_hora_toma_desayuno)+ " " + newHora);
						} else {
							horaTomaMedicamentoDesayuno
									.setSummary(getString(R.string.setting_sumary_medicamentos_hora_toma_desayuno)+  " " + getString(R.string.setting_valor_defecto_medicamentos_hora_toma_desayuno));
							horaTomaMedicamentoDesayuno
									.setText(getString(R.string.setting_valor_defecto_medicamentos_hora_toma_desayuno));
							Toast toast = Toast.makeText(
									ConfiguracionPreferenceActivity.this,
									getString(R.string.setting_mensaje_insertar_hora_toma_error_hora), Toast.LENGTH_LONG);
							toast.setGravity(Gravity.BOTTOM, 0, 0);
							toast.show();
						}
						return horaValida;
					}
				});

		horaTomaMedicamentoComida
		.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
			public boolean onPreferenceChange(Preference preference, Object newHora) {
				boolean horaValida = isHoraValida((String) newHora);
				if (horaValida) {
					horaTomaMedicamentoComida
							.setSummary(getString(R.string.setting_sumary_medicamentos_hora_toma_comida)+ " " + newHora);
				} else {
					horaTomaMedicamentoComida
							.setSummary(getString(R.string.setting_sumary_medicamentos_hora_toma_comida)+  " " + getString(R.string.setting_valor_defecto_medicamentos_hora_toma_comida));
					horaTomaMedicamentoComida
							.setText(getString(R.string.setting_valor_defecto_medicamentos_hora_toma_comida));
					Toast toast = Toast.makeText(
							ConfiguracionPreferenceActivity.this,
							getString(R.string.setting_mensaje_insertar_hora_toma_error_hora), Toast.LENGTH_LONG);
					toast.setGravity(Gravity.BOTTOM, 0, 0);
					toast.show();
				}
				return horaValida;
			}
		});

		horaTomaMedicamentoMerienda
		.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
			public boolean onPreferenceChange(Preference preference, Object newHora) {
				boolean horaValida = isHoraValida((String) newHora);
				if (horaValida) {
					horaTomaMedicamentoMerienda
							.setSummary(getString(R.string.setting_sumary_medicamentos_hora_toma_merienda)+ " " + newHora);
				} else {
					horaTomaMedicamentoMerienda
							.setSummary(getString(R.string.setting_sumary_medicamentos_hora_toma_merienda)+  " " + getString(R.string.setting_valor_defecto_medicamentos_hora_toma_merienda));
					horaTomaMedicamentoMerienda
							.setText(getString(R.string.setting_valor_defecto_medicamentos_hora_toma_merienda));
					Toast toast = Toast.makeText(
							ConfiguracionPreferenceActivity.this,
							getString(R.string.setting_mensaje_insertar_hora_toma_error_hora), Toast.LENGTH_LONG);
					toast.setGravity(Gravity.BOTTOM, 0, 0);
					toast.show();
				}
				return horaValida;
			}
		});
		
		horaTomaMedicamentoCena
		.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
			public boolean onPreferenceChange(Preference preference, Object newHora) {
				boolean horaValida = isHoraValida((String) newHora);
				if (horaValida) {
					horaTomaMedicamentoCena
							.setSummary(getString(R.string.setting_sumary_medicamentos_hora_toma_cena)+ " " + newHora);
				} else {
					horaTomaMedicamentoCena
							.setSummary(getString(R.string.setting_sumary_medicamentos_hora_toma_cena)+  " " + getString(R.string.setting_valor_defecto_medicamentos_hora_toma_cena));
					horaTomaMedicamentoCena
							.setText(getString(R.string.setting_valor_defecto_medicamentos_hora_toma_cena));
					Toast toast = Toast.makeText(
							ConfiguracionPreferenceActivity.this,
							getString(R.string.setting_mensaje_insertar_hora_toma_error_hora), Toast.LENGTH_LONG);
					toast.setGravity(Gravity.BOTTOM, 0, 0);
					toast.show();
				}
				return horaValida;
			}
		});
		
		horaTomaMedicamentoAcostarse
		.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
			public boolean onPreferenceChange(Preference preference, Object newHora) {
				boolean horaValida = isHoraValida((String) newHora);
				if (horaValida) {
					horaTomaMedicamentoAcostarse
							.setSummary(getString(R.string.setting_sumary_medicamentos_hora_toma_acostarse)+ " " + newHora);
				} else {
					horaTomaMedicamentoAcostarse
							.setSummary(getString(R.string.setting_sumary_medicamentos_hora_toma_acostarse)+  " " + getString(R.string.setting_valor_defecto_medicamentos_hora_toma_acostarse));
					horaTomaMedicamentoAcostarse
							.setText(getString(R.string.setting_valor_defecto_medicamentos_hora_toma_acostarse));
					Toast toast = Toast.makeText(
							ConfiguracionPreferenceActivity.this,
							getString(R.string.setting_mensaje_insertar_hora_toma_error_hora), Toast.LENGTH_LONG);
					toast.setGravity(Gravity.BOTTOM, 0, 0);
					toast.show();
				}
				return horaValida;
			}
		});		
		//*************************************************
		// FIN Configuracion para Medicamentos.
		//*************************************************
		
		// ********************************
		// ********************************
		// PreferenceManager.setDefaultValues(this,
		// R.xml.configuracion_xml,false);
		// SharedPreferences p
		// =PreferenceManager.getDefaultSharedPreferences(this);
		// p.getString("key", "value_default")

		// PreferenceCategory categoriaSincronizarServidor =
		// (PreferenceCategory)
		// findPreference(getResources().getString(R.string.setting_clave_categoria_sincronizacion_servidor));
		// categoriaSincronizarServidor.setOnPreferenceClickListener(new
		// OnPreferenceClickListener() {
		// public boolean onPreferenceClick(Preference preference) {
		// Toast toast = Toast.makeText(ConfiguracionPreferenceActivity.this,
		// "hemos hecho clic11", Toast.LENGTH_LONG);
		// toast.setGravity(Gravity.CENTER, 0, 0);
		// toast.show();
		// Log.i("INFO", "entramos en onClick");
		// return true;
		// }
		// });

		// PreferenceCategory categoriaMenuPrincipal = (PreferenceCategory)
		// findPreference(getResources().getString(R.string.setting_clave_categoria_principal));
		// categoriaMenuPrincipal.setOnPreferenceClickListener(new
		// OnPreferenceClickListener() {
		// public boolean onPreferenceClick(Preference preference) {
		// Toast toast = Toast.makeText(ConfiguracionPreferenceActivity.this,
		// "hemos hecho clic 22", Toast.LENGTH_LONG);
		// toast.setGravity(Gravity.CENTER, 0, 0);
		// toast.show();
		// Log.i("INFO", "entramos en onClick22");
		// return false;
		// }
		// });

		// CheckBoxPreference checkBoxPrefernce = (CheckBoxPreference)
		// findPreference(getResources().getString(R.string.setting_clave_datos_personales));
		// checkBoxPrefernce.setOnPreferenceClickListener(new
		// OnPreferenceClickListener() {
		//
		// public boolean onPreferenceClick(Preference preference) {
		// Toast toast = Toast.makeText(ConfiguracionPreferenceActivity.this,
		// "hemos hecho clic 33", Toast.LENGTH_LONG);
		// toast.setGravity(Gravity.CENTER, 0, 0);
		// toast.show();
		// Log.i("INFO", "entramos en onClick33");
		// return false;
		// }
		// });

		// CheckBoxPreference checkBoxPrefernce2 = (CheckBoxPreference)
		// findPreference(getResources().getString(R.string.setting_clave_citas_medico));
		// checkBoxPrefernce.setOnPreferenceClickListener(this);

		// *******************
		// *******************

		// TODO ir a una parte en concreto:
		// // the preference screen your item is in must be known
		// PreferenceScreen screen = getPreferenceScreen();//(PreferenceScreen)
		// findPreference("clave_datos_servidor");
		//
		// // the position of your item inside the preference screen above
		// int pos = findPreference("clave_datos_servidor").getOrder();
		//
		// // simulate a click / call it!!
		// screen.onItemClick( null, null, pos, 0 );

		// Para ir a una parte en concreto de las preferencias.
		Bundle bundle = this.getIntent().getExtras();
		if (bundle != null) {
			Boolean abrirCategoria = bundle.getBoolean("abrirCategoria");
			if ((abrirCategoria != null) && abrirCategoria) {
				String claveCategoria = bundle.getString("claveCategoria");
				int pos = findPreference(claveCategoria).getOrder() + 1;
				PreferenceScreen screen = this.getPreferenceScreen();
				screen.onItemClick(null, null, pos, 0);
			}
		}

	} // FIN onCreate()

	/*
	 * Metodo que compruba si el servidor da respuesta, Primero se comprueba si
	 * la direccion IP y puerto son correcto en estructura, despues se hace un
	 * ping al servidor con la direccion IP y puerto indicados.
	 */
	protected boolean comprobarSincronismo() {
		boolean sincronismo = false;
		if (!isDireccionIpValida(getDireccionIp(this))) {
			Toast toast = Toast
					.makeText(
							ConfiguracionPreferenceActivity.this,
							getString(R.string.setting_mensaje_sincronizacion_error_ip),
							Toast.LENGTH_LONG);
			toast.setGravity(Gravity.BOTTOM, 0, 0);
			toast.show();
			return false;
		}
		if (!isPuertoValido(getPuerto(this))) {
			Toast toast = Toast
					.makeText(
							ConfiguracionPreferenceActivity.this,
							getString(R.string.setting_mensaje_sincronizacion_error_puerto),
							Toast.LENGTH_LONG);
			toast.setGravity(Gravity.BOTTOM, 0, 0);
			toast.show();
			return false;
		}
		try {
			sincronismo = Comunicacion.doPing(getDireccionServidor(this), this
					.getResources().getInteger(R.integer.TIEMPO_DEL_SPLASH));
			if (!sincronismo) {
				Toast toast = Toast
						.makeText(
								ConfiguracionPreferenceActivity.this,
								getString(R.string.setting_mensaje_sincronizacion_error_sincro),
								Toast.LENGTH_LONG);
				toast.setGravity(Gravity.BOTTOM, 0, 0);
				toast.show();
			} else {
				Toast toast = Toast
						.makeText(
								ConfiguracionPreferenceActivity.this,
								getString(R.string.setting_mensaje_sincronizacion_realizado),
								Toast.LENGTH_LONG);
				toast.setGravity(Gravity.BOTTOM, 0, 0);
				toast.show();
			}
		} catch (IOException e) {
			Toast toast = Toast
					.makeText(
							ConfiguracionPreferenceActivity.this,
							getString(R.string.setting_mensaje_sincronizacion_error_sincro),
							Toast.LENGTH_LONG);
			toast.setGravity(Gravity.BOTTOM, 0, 0);
			toast.show();
			// Log.i("INFO", "----> sincroismo="+sincronismo);
			// e.printStackTrace();
		}
		return sincronismo;
	}

	/*
	 * Metodo que compruba si el servidor da respuesta, Primero se comprueba si
	 * la direccion IP y puerto son correcto en estructura, despues se hace un
	 * ping al servidor con la direccion IP y puerto indicados.
	 */
	protected boolean comprobarRegistroMovil() {
		boolean registrado = false;
		if (!isDNIValido(getDNI(this))) {
			Toast toast = Toast
					.makeText(
							ConfiguracionPreferenceActivity.this,
							getString(R.string.setting_mensaje_registrar_usuario_en_servidor_error_dni),
							Toast.LENGTH_LONG);
			toast.setGravity(Gravity.BOTTOM, 0, 0);
			toast.show();
			return false;
		}
		try {
			// Preparamos los datos a enviar (idDevice, numTelfno, DNI y
			// password) al servidor con el kvParameters.
			Map<String, String> kvParameters = new HashMap<String, String>();

			TelephonyManager tlf = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
			String key = getString(R.string.setting_clave_param_deviceID);
			String valor = tlf.getDeviceId();
			kvParameters.put(key, valor);

			key = getString(R.string.setting_clave_param_num_tlfno);
			valor = tlf.getLine1Number();
			kvParameters.put(key, valor);

			key = getString(R.string.setting_clave_param_dni);
			valor = getDNI(this);
			kvParameters.put(key, valor);

			key = getString(R.string.setting_clave_param_password);
			valor = getPassword(this);
			kvParameters.put(key, valor);

			String mensaje = "";
			String url = getDireccionServidor(this)+ getString(R.string.setting_direccion_registro_movil);

			int longMaxRespuesta = this.getResources().getInteger(R.integer.RESPUESTA_LONGITUD_MAX);
			mensaje = Comunicacion.getMensajeRegistro(url, kvParameters,longMaxRespuesta);
			String mensajeToast = "";

			if (isNumeric(mensaje)){
				SharedPreferences prefs = getSharedPreferences(getString(R.string.setting_name_shared_preference),Context.MODE_PRIVATE);				 
				SharedPreferences.Editor editor = prefs.edit();
				editor.putString(getString(R.string.setting_clave_shared_preference_id_usuario), mensaje);
				editor.commit();				
				setIdUsuario(mensaje);
				registrado = true;
				mensajeToast = getString(R.string.setting_mensaje_registrar_usuario_en_servidor_realizado);
			} else if (mensaje
					.equalsIgnoreCase(getString(R.string.setting_respuesta_registrar_usuario_en_servidor_ERROR_EN_BASE_DE_DATOS))) {
				registrado = false;
				mensajeToast = getString(R.string.setting_mensaje_registrar_usuario_en_servidor_error_base_de_datos);
			} else if (mensaje
					.equalsIgnoreCase(getString(R.string.setting_respuesta_registrar_usuario_en_servidor_ERROR_SERVIDOR))) {
				registrado = false;
				mensajeToast = getString(R.string.setting_mensaje_registrar_usuario_en_servidor_error_servidor);
			} else if (mensaje
					.equalsIgnoreCase(getString(R.string.setting_respuesta_registrar_usuario_en_servidor_DNI_NO_REGISTRADO))) {
				registrado = false;
				// TODO (insertar un dialgo para mandar a pantalla de registro)
				mensajeToast = getString(R.string.setting_mensaje_registrar_usuario_en_servidor_error_no_registro);
			} else if (mensaje
					.equalsIgnoreCase(getString(R.string.setting_respuesta_registrar_usuario_en_servidor_PASSWORD_INCORRECTA))) {
				registrado = false;
				mensajeToast = getString(R.string.setting_mensaje_registrar_usuario_en_servidor_error_password_incorrecta);
			} else if (mensaje
					.equalsIgnoreCase(getString(R.string.setting_respuesta_registrar_usuario_en_servidor_DISTINTO_NUMERO_TELEFONO))) {
				registrado = false;
				mensajeToast = getString(R.string.setting_mensaje_registrar_usuario_en_servidor_distinto_numero);
			} else if (mensaje
					.equalsIgnoreCase(getString(R.string.setting_respuesta_registrar_usuario_en_servidor_DISTINTO_DISPOSITIVO))) {
				registrado = false;
				mensajeToast = getString(R.string.setting_mensaje_registrar_usuario_en_servidor_distinto_dispositivo);
			} else {
				registrado = false;
				mensajeToast = getString(R.string.setting_mensaje_registrar_usuario_en_servidor_error_al_registrar);
			}
			Toast toast = Toast.makeText(ConfiguracionPreferenceActivity.this,
					mensajeToast, Toast.LENGTH_LONG);
			toast.setGravity(Gravity.BOTTOM, 0, 0);
			toast.show();

		} catch (IOException e) {
			Toast toast = Toast
					.makeText(
							ConfiguracionPreferenceActivity.this,
							getString(R.string.setting_mensaje_registrar_usuario_en_servidor_error_al_registrar),
							Toast.LENGTH_LONG);
			toast.setGravity(Gravity.BOTTOM, 0, 0);
			toast.show();
			// // Log.i("INFO", "----> registroMovil="+registrado);
			// // e.printStackTrace();
			return false;
		}
		return registrado;
	}

	/*
	 * Metodo que comprueba si la direccion introducida tiene un formato
	 * correcto. para un formata do IP v.4 (a.b.c.d)
	 */
	public static boolean isDireccionIpValida(String dir) {
		StringTokenizer st = new StringTokenizer(dir, ".");
		if (st.countTokens() != 4) {
			return false;
		}
		while (st.hasMoreTokens()) {
			String nro = st.nextToken();
			if ((nro.length() > 3) || (nro.length() < 1)) {
				return false;
			}
			int nroInt = 0;
			try {
				nroInt = Integer.parseInt(nro);
			} catch (NumberFormatException s) {
				return false;
			}
			if ((nroInt < 0) || (nroInt > 255)) {
				return false;
			}
		}
		return true;
	}

	/*
	 * Metodo que comprueba si el puerto introducido tiene un formato correcto.
	 * si el valor introducido esta comprendido entre 0 y 65535
	 */
	public static boolean isPuertoValido(String puerto) {
		int puertoInt = 0;
		try {
			puertoInt = Integer.parseInt(puerto);
		} catch (NumberFormatException s) {
			return false;
		}
		if ((puertoInt < 0) || (puertoInt > 65535)) {
			return false;
		}
		return true;
	}

	/*
	 * Metodo que comprueba si el DNI introducido tiene un formato correcto.
	 * (1234568L)
	 */
	public static boolean isDNIValido(String dni) {
		if (dni.length() == 9) {
			String num = dni.substring(0, dni.length() - 1);
			String letra = dni.substring(dni.length() - 1).toUpperCase();
			if (num.matches("[0-9]*")
					&& letra.matches("[TRWAGMYFPDXBNJZSQVHLCKE]")) {
				final String NIF_STRING_ASOCIATION = "TRWAGMYFPDXBNJZSQVHLCKE";
				Integer numero = new Integer(num);
				numero = numero % 23;
				String letraComparar = NIF_STRING_ASOCIATION.substring(numero,
						numero + 1);
				if (letra.equalsIgnoreCase(letraComparar)) {
					return true;
				} else {
					return false;
				}
			} else {
				return false;
			}
		} else {
			return false;
		}
	}

	/*
	 * Metodo que comprueba si el Password no esta vacio. (vacio = false)
	 */
	public static boolean isPasswordValido(String password) {
		if ((password == null) || (password.equals(""))) {
			return false;
		}
		return true;
	}


	public static boolean isHoraValida(String time){
		int posDosPuntos = time.indexOf(":");
		if (posDosPuntos < 0){
			return false;			
		}
		String hora = time.substring(0, posDosPuntos);
		String minuto = time.substring(posDosPuntos+1, time.length());
		int numHora = 0;
		int numMinuto = 0;
		if (isNumeric(hora) && isNumeric(minuto)){
			numHora = new Integer(hora);
			numMinuto = new Integer(minuto);
		}
		if (numHora <0 || numHora>23 || numMinuto<0 || numMinuto>59){
			return false;
		}	
		return true;
	}
	
	//*************************************************
	// Metodos Geter and Setter
	//*************************************************
	
	public static String getIdUsuario(Context context) {
		if (idUsuario==null){
			SharedPreferences preferenceDatos = context.getSharedPreferences(context.getString(R.string.setting_name_shared_preference), Context.MODE_PRIVATE);
			setIdUsuario(preferenceDatos.getString(context.getString(R.string.setting_clave_shared_preference_id_usuario), "-1"));
		}
		if (idUsuario.equals("-1")){
			setIdUsuario(null);
		}
		return idUsuario;
	}

	public static void setIdUsuario(String idUsuario) {
		ConfiguracionPreferenceActivity.idUsuario = idUsuario;
	}
	
	public static String getDireccionIp(Context context) {
		return PreferenceManager.getDefaultSharedPreferences(context)
				.getString(
						context.getResources().getString(
								R.string.setting_clave_ip_servidor), "");
	}

	public static String getPuerto(Context context) {
		return PreferenceManager.getDefaultSharedPreferences(context)
				.getString(
						context.getResources().getString(
								R.string.setting_clave_puerto_servidor), "");
	}

	public static String getDireccionServidor(Context context) {
		String direccion = "http://" + getDireccionIp(context) + ":"
				+ getPuerto(context) + "/";
		return direccion;
	}

	public static boolean isSincronismoServidor(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources().getString(
								R.string.setting_clave_sincronizacion_servidor),
						false);
	}

	public static String getDNI(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getString(
						context.getResources()
								.getString(
										R.string.setting_clave_dni_registro_en_servidor),
						"");
	}

	public static String getPassword(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getString(
						context.getResources()
								.getString(
										R.string.setting_clave_password_registro_en_servidor),
						"");
	}

	public static boolean isRegistroMovilEnServidor(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources()
								.getString(
										R.string.setting_clave_registrar_usuario_en_servidor),
						false);
	}

	public static boolean isAccesoDatosPersonales(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources().getString(
								R.string.setting_clave_datos_personales_acceso),
						false);
	}

	public static boolean isModificarDatosPersonales(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources()
								.getString(
										R.string.setting_clave_datos_personales_modificacion),
						false);
	}

	public static boolean isInsertarDatosPersonales(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources()
								.getString(
										R.string.setting_clave_datos_personales_insertar),
						false);
	}
	
	private static boolean isNumeric(String cadena){
		try {
			Long.parseLong(cadena);
			return true;
		} catch (NumberFormatException nfe){
			return false;
		}
	}

	
	public static boolean isAccesoCitasMedico(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources().getString(
								R.string.setting_clave_citas_medico_acceso),
						false);
	}

	public static boolean isModificarCitasMedico(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources()
								.getString(
										R.string.setting_clave_citas_medico_modificacion),
						false);
	}

	public static boolean isInsertarCitasMedico(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources()
								.getString(
										R.string.setting_clave_citas_medico_insertar),
						false);
	}
	
	public static boolean isAlarmaCitasMedico(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources()
								.getString(
										R.string.setting_clave_citas_medico_alarma),
						false);
	}
	
	public static boolean isAlarmaSonidoCitasMedico(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources()
								.getString(
										R.string.setting_clave_citas_medico_alarma_sonido),
						false);
	}
	
	public static boolean isAlarmaVibracionCitasMedico(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources()
								.getString(
										R.string.setting_clave_citas_medico_alarma_vibracion),
						false);
	}
	
	public static boolean isAccesoMedicamentos(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources().getString(
								R.string.setting_clave_medicamentos_acceso),
						false);
	}

	public static boolean isModificarMedicamentos(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources()
								.getString(
										R.string.setting_clave_medicamentos_modificacion),
						false);
	}

	public static boolean isInsertarMedicamentos(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources()
								.getString(
										R.string.setting_clave_medicamentos_insertar),
						false);
	}
	
	public static boolean isAlarmaMedicamentos(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources()
								.getString(
										R.string.setting_clave_medicamentos_alarma),
						false);
	}
	
	public static boolean isAlarmaSonidoMedicamentos(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources()
								.getString(
										R.string.setting_clave_medicamentos_alarma_sonido),
						false);
	}
	
	public static boolean isAlarmaVibracionMedicamentos(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources()
								.getString(
										R.string.setting_clave_medicamentos_alarma_vibracion),
						false);
	}
	
	public static String getHoraTomaDesayuno(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getString(
						context.getResources()
								.getString(
										R.string.setting_clave_medicamentos_hora_toma_desayuno),
						context.getResources()
								.getString(
										R.string.setting_valor_defecto_medicamentos_hora_toma_desayuno));
	}

	public static String getHoraTomaComida(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getString(
						context.getResources()
								.getString(
										R.string.setting_clave_medicamentos_hora_toma_comida),
						context.getResources()
								.getString(
										R.string.setting_valor_defecto_medicamentos_hora_toma_comida));
	}

	public static String getHoraTomaMerienda(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getString(
						context.getResources()
								.getString(
										R.string.setting_clave_medicamentos_hora_toma_merienda),
						context.getResources()
								.getString(
										R.string.setting_valor_defecto_medicamentos_hora_toma_merienda));
	}
	
	public static String getHoraTomaCena(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getString(
						context.getResources()
								.getString(
										R.string.setting_clave_medicamentos_hora_toma_cena),
						context.getResources()
								.getString(
										R.string.setting_valor_defecto_medicamentos_hora_toma_cena));
	}
	
	public static String getHoraTomaAcostarse(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getString(
						context.getResources()
								.getString(
										R.string.setting_clave_medicamentos_hora_toma_acostarse),
						context.getResources()
								.getString(
										R.string.setting_valor_defecto_medicamentos_hora_toma_acostarse));
	}
	
	
	public static boolean isAccesoEnfermedades(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getBoolean(context.getResources().getString(R.string.setting_clave_enfermedades_acceso), false);
	}

	public static boolean isModificarEnfermedades(Context context) {
		return PreferenceManager.getDefaultSharedPreferences(context)
				.getBoolean(context.getResources().getString(R.string.setting_clave_enfermedades_modificacion),	false);
	}

	public static boolean isInsertarEnfermedades(Context context) {
		return PreferenceManager
				.getDefaultSharedPreferences(context)
				.getBoolean(context.getResources().getString(R.string.setting_clave_enfermedades_insertar), false);
	}
	
	// *********************
	// *********************
	public static boolean isConfiguracionDatosPersonales(Context context) {
		return PreferenceManager.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources().getString(
								R.string.setting_clave_datos_personales),
						context.getResources().getBoolean(
								R.bool.setting_valor_defecto_datos_personales));
	}

	public static boolean isConfiguracionCitasMedico(Context context) {
		return PreferenceManager.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources().getString(
								R.string.setting_clave_citas_medico), true);
	}

	public static boolean isConfiguracionEnfermedades(Context context) {
		return PreferenceManager.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources().getString(
								R.string.setting_clave_enfermedades),
						context.getResources().getBoolean(
								R.bool.setting_valor_defecto_enfermedades));

	}

	public static boolean isConfiguracionPosicionamiento(Context context) {
		return PreferenceManager.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources().getString(
								R.string.setting_clave_posicionamiento), true);
	}

	public static boolean isConfiguracionAlarmasCaidas(Context context) {
		return PreferenceManager.getDefaultSharedPreferences(context)
				.getBoolean(
						context.getResources().getString(
								R.string.setting_clave_alarmas_caidas),
						context.getResources().getBoolean(
								R.bool.setting_valor_defecto_alarmas_caidas));

	}

	// public void onSharedPreferenceChanged(SharedPreferences arg0, String
	// arg1) {
	// // TODO Auto-generated method stub
	// Toast toast = Toast.makeText(this, "onSharedPreferenceChanged",
	// Toast.LENGTH_LONG);
	// toast.setGravity(Gravity.CENTER, 0, 0);
	// toast.show();
	// Log.i("INFO", "entramos en onSharedPreferenceChanged");
	// }
	//
	// public boolean onPreferenceClick(Preference arg0) {
	// // TODO Auto-generated method stub
	// Toast toast = Toast.makeText(this, "hemos hecho clic clic clic",
	// Toast.LENGTH_LONG);
	// toast.setGravity(Gravity.CENTER, 0, 0);
	// toast.show();
	// Log.i("INFO", "entramos en onClickClickClick");
	//
	// return false;
	// }
}
